#include <stdio.h>
#include "xpt2046.h"
#include "ili9327.h"

void delay(void)
{
    for (volatile size_t i = 0; i < 20; i++)
    {
    }
}

void delay10us(void)
{
    for (volatile size_t i = 0; i < 333; i++)
    {
    }
}

int XPT2046_ReadAD(uint8_t cmd)
{
    int val = 0;

    LL_GPIO_ResetOutputPin(T_SCK_GPIO_Port, T_SCK_Pin);
    // LL_GPIO_ResetOutputPin(T_MOSI_GPIO_Port, T_MOSI_Pin);
    LL_GPIO_ResetOutputPin(T_CS_GPIO_Port, T_CS_Pin);

    for (size_t i = 0; i < 8; i++)
    {
        if (0x80 & cmd)
        {
            LL_GPIO_SetOutputPin(T_MOSI_GPIO_Port, T_MOSI_Pin);
        }
        else
        {
            LL_GPIO_ResetOutputPin(T_MOSI_GPIO_Port, T_MOSI_Pin);
        }

        cmd <<= 1;

        delay();
        LL_GPIO_SetOutputPin(T_SCK_GPIO_Port, T_SCK_Pin);

        delay();
        LL_GPIO_ResetOutputPin(T_SCK_GPIO_Port, T_SCK_Pin);
    }

    delay10us();
    LL_GPIO_SetOutputPin(T_SCK_GPIO_Port, T_SCK_Pin);
    delay();
    LL_GPIO_ResetOutputPin(T_SCK_GPIO_Port, T_SCK_Pin);

    for (size_t i = 0; i < 12; i++)
    {
        delay();
        LL_GPIO_SetOutputPin(T_SCK_GPIO_Port, T_SCK_Pin);

        val <<= 1;
        if (LL_GPIO_ReadInputPort(T_MISO_GPIO_Port) & T_MISO_Pin)
        {
            val |= 1;
        }

        delay();
        LL_GPIO_ResetOutputPin(T_SCK_GPIO_Port, T_SCK_Pin);
    }

    delay();
    LL_GPIO_SetOutputPin(T_SCK_GPIO_Port, T_SCK_Pin);
    delay();
    LL_GPIO_ResetOutputPin(T_SCK_GPIO_Port, T_SCK_Pin);

    LL_GPIO_SetOutputPin(T_CS_GPIO_Port, T_CS_Pin);
    // LL_GPIO_SetOutputPin(T_MOSI_GPIO_Port, T_MOSI_Pin);
    LL_GPIO_SetOutputPin(T_SCK_GPIO_Port, T_SCK_Pin);
    return val;
}

void XPT2046_Read(void)
{
    int temp0,temp1;

#if 0
    temp0 = XPT2046_ReadAD(0x84);
    temp1 = XPT2046_ReadAD(0xf4);

    printf("\r\nt0 t1:%d %d", temp0, temp1);
#endif

#if 0
    temp0 = XPT2046_ReadAD(0xb0);
    temp1 = XPT2046_ReadAD(0xc0);

    printf("\r\nz1 z2:%d %d", temp0, temp1);
#endif

    // printf("\r\ntouch:%d", LL_GPIO_ReadInputPort(T_PEN_GPIO_Port) & T_PEN_Pin ? 0 : 1);

    if (LL_GPIO_ReadInputPort(T_PEN_GPIO_Port) & T_PEN_Pin)
    {
        return;
    }

    temp0 = XPT2046_ReadAD(0xd0);
    temp1 = XPT2046_ReadAD(0x90);

    printf("\r\nx0 y0:%d %d", temp0, temp1);

    if (temp0 < 250)
    {
        temp0 = 250;
    }
    else if (temp0 >= 3900)
    {
        temp0 = 3900 - 1;
    }

    if (temp1 < 200)
    {
        temp1 = 200;
    }
    else if (temp1 >= 3800)
    {
        temp1 = 3800 - 1;
    }

    temp0 = (temp0 - 250) * 240 / (3900 - 250);
    temp1 = (temp1 - 200) * 400 / (3800 - 200);

    printf("\r\n x  y:%d %d", temp0, temp1);

    ILI9327_DrawPoint(temp0, temp1, BLACK);
}

void XPT2046_Init(void)
{
}
